using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using 凌依.工具库;

public class 折线图
{
    private Texture2D _贴图;
    public Texture2D 贴图 { get => _贴图; }


    private List<dataNode> _数据节点 = new List<dataNode>();

    private float _最低点 = float.MaxValue;
    private float _最高点 = float.MinValue;
    private int _同时展示数据上限 = 0;
    private int _笔尖像素 = 0;
    public Color 背景色 = Color.white;

    public float this[int index]
    {
        get => _数据节点[index].value;
    }

    public int 数据长度 { get => _数据节点.Count; }

    class dataNode
    {
        public float value;
        public Color Color;
        public dataNode(float value,Color color)
        {
            this.value = value;
            Color = color;
        }
    }

    public 折线图(int 宽度,int 高度,int 同时展示数据上限,int 笔尖像素,Color 背景色)
    {
        _贴图 = new Texture2D(宽度, 高度);
        _同时展示数据上限 = 同时展示数据上限;
        _笔尖像素 = 笔尖像素;
        this.背景色 = 背景色;
        _贴图.filterMode = FilterMode.Point;
    }

    /// <summary>
    /// 本函数将通过携程的方式 防止卡顿 所以紧跟添加节点之后的代码请通过回调函数执行 !!最快需要2帧才能回调函数(100x100)像素
    /// </summary>
    /// <param name="数据"></param>
    /// <param name="色彩"></param>
    /// <param name="回调">该方法执行完毕后调用</param>
    public void 添加节点(float 数据, Color 色彩, Action 回调) => _添加节点(数据, 色彩, 回调);

    private void _添加节点(float 数据,Color 色彩, Action 回调)
    {
        dataNode 新节点 = new dataNode(数据, 色彩);
        _数据节点.Add(新节点);
        if (数据 < _最低点) _最低点 = 数据;
        if (数据 > _最高点) _最高点 = 数据;

        if (_数据节点.Count > _同时展示数据上限)
        {
            float 移除 = _数据节点[0].value;
            
            _数据节点.RemoveAt(0);

            if (移除 <= _最低点)
            {
                _最低点 = float.MaxValue;
                foreach (var item in _数据节点)
                    if (item.value < _最低点) _最低点 = item.value;
            }
            if (移除 >= _最高点)
            {
                _最高点 = float.MinValue;
                foreach (var item in _数据节点)
                    if (item.value < _最高点) _最高点 = item.value;
            }
        }
        帧更新控制器.获取实例.开启携程(Texture2D_工具.倒墨工具(_贴图, 背景色,()=>刷新贴图(回调)));
    }
    private void 刷新贴图(Action 回调)
    {
        float xMax = _贴图.width;
        float yMax = _贴图.height;

        List<PosColor> 绘制点 = new List<PosColor>();

        for (int i = 0; i < _数据节点.Count; i++)
        {
            float xPer = i / (float)_数据节点.Count;
            float x = xMax * xPer;

            float yPer = 数学_补充.取值区间百分比(_最低点, _最高点, _数据节点[i].value);

            float y = yMax * yPer;
            y -= _笔尖像素;
            绘制点.Add(new PosColor((int)x, (int)y, _数据节点[i].Color));
        }
        帧更新控制器.获取实例.开启携程(Texture2D_工具.绘制线段(_贴图, 绘制点.ToArray(), _笔尖像素,回调));
    }

    public void 清空节点() => _数据节点 = new List<dataNode>();

}
